package com.ruralflow.system.service;

import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * @author bairimengchang
 * @version 1.0
 * @description 流程引擎业务接口实现类接口
 * 提取出这么一个基础接口，方便其他业务模块快速使用，不需要再单独引入activiti-engine相关依赖
 * @date 2025/1/18
 */
public interface IActivitiService {

    /**
     * 部署流程
     * @param inputStream bpmn文件流
     * @param processName 流程名称
     * @return ProcessDefinition 流程定义信息对象
     */
    ProcessDefinition deployProcess(InputStream inputStream, String processName);

    /**
     * 删除流程（非强制删除，如果有关联流程示例则会报错）
     * @param processDefinitionId 流程定义ID
     */
    void deleteProcess(String processDefinitionId);

    /**
     * 强制删除流程
     * @param processDefinitionId 流程定义ID
     */
    void forceDeleteProcess(String processDefinitionId);

    /**
     * 发起流程实例
     * @param processDefinitionKey 流程定义key
     * @param businessKey 业务key
     * @param variables 流程变量（可以什么参数都不携带new HashMap<>()即可，直接在bpmn文件写死也可以）
     */
    ProcessInstance startProcessInstance(String processDefinitionKey,
                                         String businessKey,
                                         Map<String, Object> variables);

    /**
     * 查询指定处理人的待办任务列表
     * @param assignee 处理人
     * @return List<Task> 待办任务列表
     */
    List<Task> findTaskList(String assignee);

    /**
     * 查询当前流程实例的待办任务（目前只支持单流程对应单人待办）
     * @param processInstanceId 流程实例ID，可以从业务表中绑定的记录字段直接取到
     * @return String 待办任务处理人
     */
    Task findTask(String processInstanceId);

    /**
     * 完成当前任务（即正常完成（同意申请）当前节点任务，往下继续任务流程，任务id可以通过上面的方法取到任务，再取id即可）
     * @param taskId 任务ID
     * @param variables 流程变量（可以什么参数都不携带new HashMap<>()即可）
     */
    void completeTask(String taskId, Map<String, Object> variables);

    /**
     * 终止任务流程（即不同意审批，要驳回）
     * @param processInstanceId 流程实例ID，可以从业务表中绑定的记录字段直接取到
     */
    void terminateProcessInstance(String processInstanceId);

    /**
     * 查询已经完成的任务列表
     * @param assignee 处理人
     * @return List<HistoricTaskInstance> 已经完成的任务列表
     */
    List<HistoricTaskInstance> findProcessedHistoricTaskList(String assignee);

    /**
     * 根据流程id获取业务表关联businessKey
     * @param processInstanceId 流程实例ID，可以从业务表中绑定的记录字段直接取到
     * 业务表中的关联字段，即businessKey
     */
    String getBusinessKeyByProcessInstanceId(String processInstanceId);

}
